# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html

import scrapy
import os
from scrapy.exceptions import DropItem
from utils.pysql_helper import sql_helper
from settings import Conn_Config
from orm.car_crawl_orm import Car_Crawl_ORM
from settings import IMAGES_STORE,IMAGES_THUMBS

from items import *

# 配置 dbhelper
db_helper = sql_helper(**Conn_Config)

class GuaziSpiderPipeline(object):

	def process_item(self, item, spider):
		# 插入时 检测 表是否创建，创建则插入数据
		# db_helper.insert_table_not_exist_create(item)

		# 异步插入数据（暂时插不进去，可能哪里封装的有问题，找不到原因）
		# db_helper.aync_insert_obj(item)

		# 同步插入,可能不同爬虫 插入到不同的地方，需要有 标识判断，比如：判断 item 类型
		if not isinstance(item, CarImage):
			if spider.name == "guazi":
				db_helper.insert_obj(item)
			elif spider.name == "guazi_crawl" or spider.name == "guazi_redis" or spider.name == "guazi_redis_crawl":
				# 封装sqlhelpr 插入 caritem_crawl 表
				db_helper.insert_obj(item)
				# orm 方式插入 car_crawl_orm 表
				car_crawl_orm = Car_Crawl_ORM(
					detail_url=item.get('detail_url', None),
					url_finger_print=item.get('url_finger_print', None),
					title=item.get('title', None),
					licensing_time=item.get('licensing_time', None),
					mileage=item.get('mileage', None),
					displacement=item.get('displacement', None),
					gearbox=item.get('gearbox', None),
					img_src=item.get('img_src', None),
					sale_price=item.get('sale_price', None),
					year_check=item.get('year_check', None),
					insurance=item.get('insurance', None),
					store=item.get('store', None),
					look_addr=item.get('look_addr', None),
					owner=item.get('owner', None))

				print("######################")
				# 调用 str 序列化 json 字符串后 打印
				print(car_crawl_orm)
				print("######################")

				if isinstance(car_crawl_orm, list):
					spider.orm_session.add_all(car_crawl_orm)
				else:
					spider.orm_session.add(car_crawl_orm)
				# 必须 commit,不然数据没有插入数据库！！！
				spider.orm_session.commit()
			else:
				print(type(item))
		else:
			print(type(item))
		return item

from scrapy.pipelines.images import ImagesPipeline



class GuaziImagePipeline(ImagesPipeline):
		"""
		图片下载参考：https://www.jianshu.com/p/097c494dab48
		Scrapy 中文文档：https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/images.html?highlight=imagespipeline#scrapy.contrib.pipeline.images.ImagesPipeline
		"""
		def get_media_requests(self, item, spider):
			if isinstance(item, CarImage):  # 注意其他 item 对象也会走 进来 ，这里 务必判断 一下！！！
				# 如果传的是多个图片路径，这里需要 for遍历 进行 scrapy.Request src，不过 我在 parse_car_detail 中，每次  yield scrapy.Request 一个图片的src 地址，所以这里不用遍历
				img_src = item.get("img_src", None)
				if img_src:
					yield scrapy.Request(img_src)
			else:
				print(type(item))

		def item_completed(self, results, item, info):

				try:
					if isinstance(item, CarImage):  # 注意其他 item 对象也会走 进来 ，这里 务必判断 一下！！！
						img_path = [x['path'] for ok, x in results if ok]
						if not img_path:
							raise DropItem("Item contains no images")

						if isinstance(img_path,list):
							img_path = img_path[0]

						#图片名称
						img_file_name = os.path.basename(img_path)

						#拼接相对路径
						item.setdefault("img_full_path", IMAGES_STORE + "/"+ img_path)

						# 缩略图路径
						img_keys = list(IMAGES_THUMBS.keys())
						for img_key in img_keys:
							item.setdefault(f'img_{img_key}_path', IMAGES_STORE + "/thumbs/"+img_key+ "/"+img_file_name)

						#打印下载的图片信息
						print("############################################")
						print(item)
						print("############################################")

						#TODO: 下载的图片 所有的相对路径已经获取到，更新 数据表中需要用到的 相对图片路径 即可！
					else:
						print(type(item))
				except Exception as ex:
					print(ex)
				finally:
					return item  # 默认情况下， item_completed() 方法返回项目。